#ifndef	___MOTOR_H___
#define	___MOTOR_H___

#include "stm32f10x.h"
#include "delay.h"
#include "Config.h"
#include "time.h"

/*******************X轴宏定义**************************/
#define XM_EN_PORT            	GPIOB					
#define XM_EN_PIN             	GPIO_Pin_2			
#define XM_STEP_PORT          	GPIOE					
#define XM_STEP_PIN           	GPIO_Pin_7			
#define XM_DIR_PORT           	GPIOE					
#define XM_DIR_PIN            	GPIO_Pin_8			
		
//X电机使能
#define XM_Enable()           	GPIO_ResetBits(XM_EN_PORT, XM_EN_PIN)      
//X电机失能
#define XM_Disable()          	GPIO_SetBits(XM_EN_PORT, XM_EN_PIN)     
//X电机正转
#define XM_Dir_Forward()       	GPIO_ResetBits(XM_DIR_PORT, XM_DIR_PIN)  
//X电机反转
#define XM_Dir_Reverse()      	GPIO_SetBits(XM_DIR_PORT, XM_DIR_PIN)


/********************Y轴宏定义**********************/
#define YM_EN_PORT            	GPIOE
#define YM_EN_PIN             	GPIO_Pin_12
#define YM_STEP_PORT          	GPIOE
#define YM_STEP_PIN           	GPIO_Pin_13
#define YM_DIR_PORT           	GPIOE
#define YM_DIR_PIN            	GPIO_Pin_14

//Y电机使能
#define YM_Enable()           	GPIO_ResetBits(YM_EN_PORT, YM_EN_PIN);      
//Y电机失能
#define YM_Disable()          	GPIO_SetBits(YM_EN_PORT, YM_EN_PIN); 
//Y电机正转
#define YM_Dir_Forward()     	GPIO_SetBits(YM_DIR_PORT, YM_DIR_PIN) //与老版本相反
//Y电机反转
#define YM_Dir_Reverse()       	GPIO_ResetBits(YM_DIR_PORT, YM_DIR_PIN)

/*******************Z轴宏定义*********************/
#define ZM_EN_PORT            	GPIOE
#define ZM_EN_PIN             	GPIO_Pin_9
#define ZM_STEP_PORT          	GPIOE
#define ZM_STEP_PIN           	GPIO_Pin_10
#define ZM_DIR_PORT           	GPIOE
#define ZM_DIR_PIN            	GPIO_Pin_11

//Z电机使能
#define ZM_Enable()           	GPIO_ResetBits(ZM_EN_PORT, ZM_EN_PIN); 
//Z电机失能
#define ZM_Disable()          	GPIO_SetBits(ZM_EN_PORT, ZM_EN_PIN); 
//Z电机正转
#define ZM_Dir_Forward()      	GPIO_SetBits(ZM_DIR_PORT, ZM_DIR_PIN)
//Z电机反转
#define ZM_Dir_Reverse()      	GPIO_ResetBits(ZM_DIR_PORT, ZM_DIR_PIN)
 

/**********************X轴限位宏定义****************/
#define XM_LSW_PORT        		GPIOB 
#define XM_LSW_PIN            	GPIO_Pin_7
//X轴限位检测
#define XM_LSW_Status()        	GPIO_ReadInputDataBit(XM_LSW_PORT,XM_LSW_PIN) 
/*********************Y轴限位宏定义****************/
#define YM_LSW_PORT           	GPIOA 
#define YM_LSW_PIN            	GPIO_Pin_15
//Y轴限位检测
#define YM_LSW_Status()        	GPIO_ReadInputDataBit(YM_LSW_PORT,YM_LSW_PIN) 
/*********************Z轴限位宏定义****************/
#define ZM_LSW_H_PORT			GPIOD
#define ZM_LSW_H_PIN        	GPIO_Pin_0
//Z轴上限位检测
#define ZM_LSW_H_Status()       GPIO_ReadInputDataBit(ZM_LSW_H_PORT,ZM_LSW_H_PIN) 

#define ZM_LSW_L_PORT         	GPIOD
#define ZM_LSW_L_PIN          	GPIO_Pin_1
//Z轴下限位检测
#define ZM_LSW_L_Status()       GPIO_ReadInputDataBit(ZM_LSW_L_PORT,ZM_LSW_L_PIN) 
/**********************激光宏定义******************/
#define LASER_R_PORT         	GPIOE
#define LASER_R_PIN          	GPIO_Pin_1
//激光接收检测
#define LASER_R_Status()      	GPIO_ReadInputDataBit(LASER_R_PORT,LASER_R_PIN)    //低电平：接收到激光  高电平：阻挡

#define LASER_T_PORT         	GPIOB
#define LASER_T_PIN          	GPIO_Pin_9
//打开激光
#define LASER_T_ON()          	GPIO_SetBits(LASER_T_PORT, LASER_T_PIN)
//关闭激光
#define LASER_T_OFF()          	GPIO_ResetBits(LASER_T_PORT, LASER_T_PIN)


/***************电机移动时间宏定义********************/
//X
#define	X_MOVE_STEP_TIME		DRAWING_XM_MOVE_STEP_TIME		//X轴慢速移动一步 电平保持的时间参数
#define	X_RUN_STEP_TIME			DRAWING_XM_RUN_STEP_TIME		//X轴快速移动一步 电平保持的时间参数
#define	X_REDUCE_SPEED_STEP		DRAWING_XM_REDUCE_SPEED_STEP		//X轴减速距离
#define X_INCREASE_SPEED_STEP		DRAWING_XM_INCREASE_SPEED_STEP		//X轴加速距离
#define XM_HOLD_TIME                    DRAWING_XM_HOLD_TIME                    //X轴三轴联动时保持电平的时间 单位 为100us

//Y 
#define	Y_MOVE_STEP_TIME		DRAWING_YM_MOVE_STEP_TIME 		//Y轴慢速移动一步 电平保持的时间参数
#define	Y_RUN_STEP_TIME			DRAWING_YM_RUN_STEP_TIME		//Y轴快速移动一步 电平保持的时间参数
#define	Y_REDUCE_SPEED_STEP		DRAWING_YM_REDUCE_SPEED_STEP		//Y轴减速距离 
#define Y_INCREASE_SPEED_STEP		DRAWING_YM_INCREASE_SPEED_STEP		//Y轴加速距离
#define YM_HOLD_TIME                    DRAWING_YM_HOLD_TIME                     //Y轴三轴联动时保持电平的时间

//Z
#define Z_MOVE_STEP_TIME		DRAWING_ZM_MOVE_STEP_TIME		//Z轴慢速移动一步 电平保持的时间参数
#define	Z_RUN_STEP_TIME			DRAWING_ZM_RUN_STEP_TIME		//Z轴快速移动一步 电平保持的时间参数
#define	Z_REDUCE_SPEED_STEP		DRAWING_ZM_REDUCE_SPEED_STEP		//Z轴减速距离
#define Z_INCREASE_SPEED_STEP		DRAWING_ZM_INCREASE_SPEED_STEP		//Z轴加速距离
#define ZM_HOLD_TIME                    DRAWING_ZM_HOLD_TIME                    //Z轴三轴联动时保持电平的时间

//XY
#define XM_XY_HOLD_TIME                 DRAWING_XM_XY_HOLD_TIME                 //XY同时移动时X轴速度
#define YM_XY_HOLD_TIME                 DRAWING_YM_XY_HOLD_TIME                 //XY同时移动时Y轴速度


#define MOTOR_REMOVE_JIT		5	//消抖5次有效

extern int XM_Compense;
//函数声明
extern void MOTOR_Configuration(void);

extern void XM_RunOneStep(void);
extern void XM_MoveOneStep(void);
extern void XM_ContinueRunStep(uint16_t steps);
extern void XM_ReduceSpeed(void);
extern void XM_ReduceSpeed_Compensation(uint16_t FillVal);
extern void XM_IncreaseSpeed(void);
extern void XM_UpdateOffset(uint32_t offset);
extern uint16_t XM_GetOffsetDirection(void);
extern uint16_t XM_GetOffset(void);
extern void XM_BackCompensation(void);
extern void XM_Back(void);

extern void YM_RunOneStep(void);
extern void YM_MoveOneStep(void);
extern void YM_ContinueRunStep(uint16_t steps);
extern void YM_IncreaseSpeed(void);
extern void YM_ReduceSpeed(void);
extern void YM_UpdateOffset(uint32_t offset);
extern uint16_t YM_GetOffsetDirection(void);
extern uint16_t YM_GetOffset(void);
extern void YM_Back(void);

extern void ZM_IncreaseSpeed(void);
extern void ZM_ReduceSpeed(void);
extern void ZM_RunOneStep(void);
extern void ZM_MoveOneStep(void);
extern void ZM_UpdateOffset(uint32_t offset);
extern uint16_t ZM_GetOffsetDirection(void);
extern uint16_t ZM_GetOffset(void);
extern void ZM_RaiseOffset(void);
extern uint8_t ZM_Raise(void);
extern void ZM_Back(void);
extern void MOTOR_AllMotorMoveToZero(void);
extern void Motor_MoveToCoord(uint16_t x,uint16_t y);
extern void MOTOR_XY_MoveToDot(uint16_t x,uint16_t y);
extern void MOTOR_XY_MoveToDot_NoReset(uint16_t x,uint16_t y);

extern void MOTOR_MachineReset(void);

#endif

